package taller.dataLayer.managers;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import taller.dataLayer.entities.Cotizacion;
import taller.dataLayer.entities.ItemCotizacion;
import taller.dataLayer.vo.CotizacionVO;
import taller.dataLayer.vo.ItemCotizacionVO;
import taller.dataLayer.vo.RodamientoVO;

@Stateless
public class AdministradorCotizacionesBean implements AdministradorCotizaciones {
	@PersistenceContext(name="taller14")
	EntityManager entityManager;
	
	@EJB(beanName="AdministradorRodamientosBean")
	private AdministradorRodamientos adminRodamientos;
	
    public AdministradorCotizacionesBean() {
    }

    public void guardar(CotizacionVO cotizacion) {
    	for (ItemCotizacionVO itemCotizacion : cotizacion.getItems()) {
			RodamientoVO rodamiento = adminRodamientos.buscar(itemCotizacion.getRodamiento());
			itemCotizacion.setRodamiento(rodamiento);
		}
    	
    	Cotizacion cotizacionEB = new Cotizacion();
    	cotizacionEB.setVO(cotizacion);
    	
    	if (this.buscar(cotizacion) != null) {
			entityManager.merge(cotizacionEB);
		} else {
			entityManager.persist(cotizacionEB);
		}
    }
    
	public CotizacionVO buscar(CotizacionVO cotizacion) {
		Cotizacion retVal = (Cotizacion) entityManager.find(Cotizacion.class, cotizacion.getNumero());
		return retVal != null? retVal.getVO() : null;
	}
	
	@SuppressWarnings("unchecked")
	public List<CotizacionVO> buscarTodas() {
		List<Cotizacion> cotizaciones = entityManager.createQuery("from Cotizacion").getResultList();
		List<CotizacionVO> cotizacionesVO = new ArrayList<CotizacionVO>();
		Iterator<Cotizacion> i = cotizaciones.iterator();
		while(i.hasNext()){
			CotizacionVO cotizacion = i.next().getVO();
			cotizacionesVO.add(cotizacion);
		}
		
		return cotizacionesVO;
	}
	
	@SuppressWarnings("unchecked")
	public ItemCotizacionVO buscarUltimaCotizacionParaRodamiento(RodamientoVO rodamiento) {
		
		Query query = entityManager.createQuery("select ic from ItemCotizacion ic, Cotizacion c " 
				+ " where c = ic.cotizacion "
			    + " and ic.rodamiento.codigo = :codigoRodamiento " 
			    + " and c.fechaVigenciaDesde <= :fechaDesde and c.fechaVigenciaHasta >= :fechaHasta " 
			    + " order by ic.id DESC");
		
		query.setParameter("codigoRodamiento", rodamiento.getCodigo());
		query.setParameter("fechaDesde", new Date());
		query.setParameter("fechaHasta", new Date());
		
		List<ItemCotizacion> lista = query.getResultList();
		
		return lista.size() > 0 ? lista.get(0).getVO() : null;
	}
}
